package com.iseastar.guojiang.loc;

import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Message;
import android.os.PowerManager;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.iseastar.guojiang.consts.MsgID;
import com.iseastar.guojiang.util.MediaPlayerUtils;

import droid.frame.activity.HandlerMgr;
import droid.frame.service.BaseService;
import droid.frame.utils.android.Log;
import droid.frame.utils.android.Notify;
import droid.frame.utils.lang.Str;

/**
 * Created by joker on 2017/12/20.
 * 用于火箭侠刚进来的时候进行定位
 */
public class CourierLocationService extends BaseService implements AMapLocationListener {

    //    // 定位相关
//    private LocationClient mLocClient;
//    //
    private int msgId = -1;
    private PowerManager.WakeLock wakeLock = null;
    private AMapLocation mLocation = null;
    private MediaPlayer mediaPlayer = null;
    //
//    @Override
//    public void onCreate() {
//        super.onCreate();
//        // 定位初始化
////        mLocClient = new LocationClient(this);
////        mLocClient.registerLocationListener(this);
////        LocationClientOption option = new LocationClientOption();
////        option.setIsNeedAddress(true);// 设置以后,请求结果 BDLocation#getCity 就不为null了
////        option.setOpenGps(true);// 打开gps
////        option.setCoorType("bd09ll"); // 设置坐标类型
////        option.setScanSpan(10000);// 定位频率
////        mLocClient.setLocOption(option);
////        mLocClient.start();
//        initBaiDu();
//        //
//        isStarted = true;
//    }
//
//    @Override
//    public int onStartCommand(Intent intent, int flags, int startId) {
//        if (intent != null) {
//            msgId = intent.getIntExtra("msgId", -1);
//        }
//        // 刷新定位
//        if (mLocClient != null && mLocClient.isStarted()) {
//            mLocClient.requestLocation();
//        }
//        return super.onStartCommand(intent, flags, startId);
//    }
//
//    /**
//     * 初始化百度地图
//     */
//    private void initBaiDu() {
//        // 定位初始化
//        mLocClient = new LocationClient(this);
//        mLocClient.registerLocationListener(locationListener);
//        LocationClientOption option = new LocationClientOption();
//        option.setIsNeedAddress(true);// 设置以后,请求结果 BDLocation#getCity 就不为null了
////                option.setOpenGps(true);// 打开gps
//        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//        option.setCoorType("bd09ll"); // 设置坐标类型
//        option.setScanSpan(20000);// 定位频率
//        //可选，定位SDK内部是一个service，并放到了独立进程。
//        //设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)
//        option.setIgnoreKillProcess(true);
//        mLocClient.setLocOption(option);
//        mLocClient.start();
//    }
//
//    /**
//     * 定位SDK监听函数
//     */
//    LocationListener locationListener = new LocationListener() {
//        @Override
//        public void onReceiveLocation(BDLocation location) {
//            int errorCode = location.getLocType();
//            Log.d("33333", "错误码：" + errorCode);
//            if (location == null || Str.isEmpty(location.getCity())) {
//                // 刷新定位
//                if (mLocClient != null) {
//                    SDKInitializer.initialize(BeeApplication.getContext());
//                    mLocClient.unRegisterLocationListener(locationListener);
//                    mLocClient.stop();
//                    mLocClient = null;
//                    initBaiDu();
//                } else {
//                    initBaiDu();
//                }
//            } else {
//                Message msg = Message.obtain();
//                if (msgId == -1) {
//                    msg.what = MsgID.location_baidu;
//                } else {
//                    msg.what = msgId;
//                    if (msgId != MsgID.courier_location_upload_data) {
//                        msgId = -1;// reset
//                    }
//                }
//                msg.obj = location;
//                HandlerMgr.sendMessage(msg, 0);
//            }
//            //
//            // int userId = ((BeeApplication) getApplication()).getUser().getId();
//            // AppHttp.getInstance().beat(userId, location.getLatitude(), location.getLongitude());
//        }
//    };
//
//    @Override
//    public void onDestroy() {
//        super.onDestroy();
//        msgId = -1;// reset
//        mLocClient.unRegisterLocationListener(locationListener);
//        // 退出时销毁定位
//        mLocClient.stop();
//        //
//        isStarted = false;
//    }

    //声明AMapLocationClient类对象
    private AMapLocationClient mLocationClient = null;


    @Override
    public void onCreate() {
        super.onCreate();
        Notify.getInstance().startForeground(this);
        initGaoDe();
    }

    private void initGaoDe() {
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
        //设置定位回调监听
        mLocationClient.setLocationListener(this);
        AMapLocationClientOption option = new AMapLocationClientOption();
        /**
         * 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
         */
        option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.Sport);
        //设置定位模式为AMapLocationMode.Device_Sensors，仅设备模式。
//        option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
        //获取一次定位结果：
        //该方法默认为false。
        option.setOnceLocation(false);

        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
//        option.setOnceLocationLatest(true);
        //设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。
        option.setInterval(10000);
        //设置是否返回地址信息（默认返回地址信息）
        option.setNeedAddress(true);
        //设置是否允许模拟位置,默认为true，允许模拟位置
        option.setMockEnable(true);
//        option.setGpsFirst(true);
        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
//        option.setHttpTimeOut(20000);
        //关闭缓存机制
//        option.setLocationCacheEnable(false);
        if (null != mLocationClient) {
            mLocationClient.setLocationOption(option);
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }
    }

    //
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            msgId = intent.getIntExtra("msgId", -1);
        }
        flags = START_STICKY;
        acquireWakeLock();
        // 刷新定位
        if (mLocationClient != null && mLocationClient.isStarted()) {
            mLocationClient.startLocation();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onLocationChanged(AMapLocation location) {
        int errorCode = location.getErrorCode();
//        DealTaskService.writerLogToFile("定位的错误码：" + errorCode + ",定位的 MSGID:" + msgId);
        Log.d("33333", "错误码：" + errorCode);
        if (location == null || Str.isEmpty(location.getCity()) || errorCode != 0) {
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        } else {
            mLocation = location;
        }
        if (mLocation != null) {
            Message msg = Message.obtain();
            if (msgId == -1) {
                msg.what = MsgID.location_baidu;
            } else {
                msg.what = msgId;
                if (msgId != MsgID.courier_location_upload_data) {
                    msgId = MsgID.courier_location_upload_data;// reset
                }
            }
            msg.obj = location;
            HandlerMgr.sendMessage(msg, 0);
        }
        //
        // int userId = ((BeeApplication) getApplication()).getUser().getId();
        // AppHttp.getInstance().beat(userId, location.getLatitude(), location.getLongitude());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseWakeLock();
        if (mLocationClient != null) {
            mLocationClient.unRegisterLocationListener(this);
            mLocationClient.stopLocation();//停止定位后，本地定位服务并不会被销毁
            mLocationClient.onDestroy();//销毁定位客户端，同时销毁本地定位服务。
        }
        pausePlayer();
    }

    /**
     * PARTIAL_WAKE_LOCK:保持CPU 运转，屏幕和键盘灯有可能是关闭的。
     * SCREEN_DIM_WAKE_LOCK：保持CPU 运转，允许保持屏幕显示但有可能是灰的，允许关闭键盘灯
     * SCREEN_BRIGHT_WAKE_LOCK：保持CPU 运转，允许保持屏幕高亮显示，允许关闭键盘灯
     * FULL_WAKE_LOCK：保持CPU 运转，保持屏幕高亮显示，键盘灯也保持亮度
     * ACQUIRE_CAUSES_WAKEUP：强制使屏幕亮起，这种锁主要针对一些必须通知用户的操作.
     * ON_AFTER_RELEASE：当锁被释放时，保持屏幕亮起一段时间
     */
    private void acquireWakeLock() {
        if (null == wakeLock) {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
                    | PowerManager.ON_AFTER_RELEASE, getClass()
                    .getCanonicalName());
            if (null != wakeLock) {
                //   Log.i(TAG, "call acquireWakeLock");
                Log.d("33333", "call acquireWakeLock");
                wakeLock.acquire();
            }
        }
    }

    // 释放设备电源锁
    private void releaseWakeLock() {
        if (null != wakeLock && wakeLock.isHeld()) {
            Log.d("33333", "call releaseWakeLock");
            //   Log.i(TAG, "call releaseWakeLock");
            wakeLock.release();
            wakeLock = null;
        }
    }

//    /**
//     * 设置应用进入后台，播放音频来进行cpu不休眠，进行应用保活
//     */
//    private void setAppBackgroundPlayer() {
//        MediaPlayerUtils.getInstance().playerMusic("courier_silence.mp3", true);
//    }

    private void pausePlayer() {
        MediaPlayerUtils.getInstance().destoryPlayer();
    }
}
